/*
 * Gramatica
 * 
 * Version 
 *
 * 23/10/2013
 * 
 * Licencia
 */
package proyecto2.logica;

import java.util.ArrayList;
import java.util.List;

public class Gramatica {

    List<Regla> reglas;
    DFA _miDFA;

    public Gramatica(DFA dfa) {
        reglas = new ArrayList<>();
        _miDFA = dfa;
        for (Transicion t : _miDFA.getTransiciones()) {
            reglas.add(new Regla(t.getOrigen(), t.getVariable(), t.getDestino(), t.getOrigen().ES_INICIAL(), t.getOrigen().ES_FINAL()));
        }
    }

    public List< String> getDerivation(String s) {
        List<String> lista = new ArrayList<>();
        Estado actual = _miDFA.getInicial();
        String aux;
        for (int i = 0; i < s.length(); i++) {
            String subHilera = String.valueOf(s.charAt(i));
            aux = actual.getId() + subHilera;
            actual = buscarEstado(actual, subHilera);
            aux += actual.getId();
            lista.add(aux);
        }
        return lista;
    }

    public String obtenerListaDerivacion(String s) {
        List<String> reglas = getDerivation(s);
        String reg = "";
        for (int i = 0; i < reglas.size(); i++) {
            reg += reglas.get(i);
            if (i < reglas.size() - 1) {
                reg += " -> ";
            }
        }
        return reg;
    }

    private Estado buscarEstado(Estado actual, String subhilera) {
        Estado siguiente = null;
        for (Transicion t : _miDFA.getTransiciones()) {
            if (t.getOrigen().equals(actual) && t.getVariable().equals(subhilera)) {
                siguiente = t.getDestino();
            }
        }
        return siguiente;
    }

    public List<Regla> getReglas() {
        return reglas;
    }

    @Override
    public String toString() {
        String toS = "";
        for (Regla rule : reglas) {
            toS += rule.toString();
        }
        return toS;
    }
}
